package cn.wdm.ymcc.service.impl;

import cn.wdm.ymcc.domain.CourseMarket;
import cn.wdm.ymcc.domain.CourseUserLearn;
import cn.wdm.ymcc.dto.PayNotifyDto;
import cn.wdm.ymcc.mapper.CourseUserLearnMapper;
import cn.wdm.ymcc.service.ICourseMarketService;
import cn.wdm.ymcc.service.ICourseUserLearnService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Date;
import java.util.Map;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author lao.zhang
 * @since 2022-07-21
 */
@Service
public class CourseUserLearnServiceImpl extends ServiceImpl<CourseUserLearnMapper, CourseUserLearn> implements ICourseUserLearnService {
    @Autowired
    private ICourseMarketService courseMarketService;
    /**
     * 支付成功保存购买记录，授权
     * 1.增加购买记录 login_id start_time end_time state course_id course_order_no
     * 2.查询出之前有无购买记录
     * 2.1 没有购买记录 就新增一条购买记录
     * 2.2 有购买记录
     * 都要修改新的订单号
     *  2.2.1 课程观看过期，则覆盖之前的购买记录
     *  2.2.2 课程没有过期，则修改过期时间即可
     * @param dto
     */
    @Override
    public void paySuccessSaveUserLearn(PayNotifyDto dto) {
        //1.得到参数
        Map<String,Object> extParamMap = JSONObject.parseObject(dto.getExtParams(), Map.class);
        Integer userId = (Integer) extParamMap.get("userId");
        String[] courseIdsStr = extParamMap.get("courseId").toString().split(",");
        for (String courseIdStr : courseIdsStr) {
            Long courseId = Long.valueOf(courseIdStr);
            //查询出需要用到的参数 courseMarket可以查看款看时间
            CourseMarket courseMarket = courseMarketService.selectById(courseId);
            CourseUserLearn userLearnTem=selectUserLearnByUserAndCouseId(Long.valueOf(userId),courseId);
            //2.查询出之前有无购买记录
            //* 2.1 没有购买记录 就新增一条购买记录
            Date date = new Date();
            if(userLearnTem==null){
                CourseUserLearn userLearn = new CourseUserLearn();
                userLearn.setLoginId(Long.valueOf(userId));
                userLearn.setStartTime(date);
                //现在的时间+可观看的时间
                userLearn.setEndTime(DateUtils.addDays(date,courseMarket.getValidDays()));
                //0已购买，1已过期
                userLearn.setState(0);
                userLearn.setCourseId(courseId);
                userLearn.setCourseOrderNo(dto.getOrderNo());
                userLearn.setCreateTime(date);
                insert(userLearn);
            }
            //* 2.2 有购买记录
            //* 都要修改新的订单号
            userLearnTem.setCourseOrderNo(dto.getOrderNo());
            //*  2.2.1 课程观看过期，则覆盖之前的购买记录
            if(userLearnTem.getEndTime().before(date)){//最后过期时间在现在时间之前，过期了
                userLearnTem.setStartTime(date);
                userLearnTem.setEndTime(DateUtils.addDays(date,courseMarket.getValidDays()));
                userLearnTem.setState(0);
                userLearnTem.setCreateTime(date);
            }else{
                //*  2.2.2 课程没有过期，则修改过期时间即可
                userLearnTem.setEndTime(DateUtils.addDays(userLearnTem.getEndTime(),courseMarket.getValidDays()));
            }
            updateById(userLearnTem);
        }


    }
    /**
     * 根据课程id和Userid查询购买记录
     * @param userId
     * @param courseId
     * @return
     */
    private CourseUserLearn selectUserLearnByUserAndCouseId(Long userId, Long courseId) {
        Wrapper<CourseUserLearn> wrapper=new EntityWrapper<>();
        wrapper.eq("course_id",courseId);
        wrapper.eq("login_id",userId);
        CourseUserLearn userLearn = selectOne(wrapper);
        return userLearn;
    }
}
